# 第二章

# # 第一节 python常用内置对象
# # 2.1.1
# from decimal import Decimal, getcontext
# from fractions import Fraction
# import math
# x = 3
# print(x**2)
# x += 6
# x = [1, 5, 3]
# x[1] = 5
# print(x)

# # 2.1.2数字
# # 内置整数与复数
# print(0.2+0.3)
# print(0.3-0.2)  # 精度问题 应该尽量避免在直接对比大小
# print((0.3-0.2) == 0.1)
# # 常用的两种比大小方法
# print(abs(0.3-0.2-0.1) < 1e-6)
# print(math.isclose(0.3-0.2, 0.1))

# # 选讲
# x = Fraction(3, 5)  # 分数定义
# print(x)
# print(x.numerator)  # 打印分子
# print(x.denominator)  # 打印分母

# print(1/3)
# y = Decimal(1)/Decimal(3)  # 高精度实数运算
# print(y)


# # 2.1.3字符串与字节串
# x='''TOM said,"let's go'''
# print(x)
# x='good'+'morning'
# print(x)

# 遵义会议精神='坚定信念'+'实事求是'
# print(遵义会议精神)

# print(type('hello world'))
# print(type(b'hello world'))#定界符前加b表示字节串,b表示字节串
# print('hello world'.encode('utf-8'))
# print('夏天沉落在猫眼的钟面'.encode('utf-8'))
# print('夏天沉落在猫眼的钟面'.encode('gbk'))#编码格式
# x='夏天沉落在猫眼的钟面'.encode('gbk')
# y=x.decode('gbk')#按gbk格式解码
# print(y)
# # print(_.decode('gbk'))

# # 2.1.4列表、元组、字典、集合
# x_list = [1, 2, 3]  # 列表。这个最像数组
# x_tupe = (1, 2, 3, 4)  # 元组！！不可变
# x_dict = {'a': 11, 'b': 22, 'c': 33}  # 字典！无序，可变，这里的abc是键值，不可重复，有点像无序的结构体
# x_set = {3, 2, 1, 0, 4, 5}  # 集合！可变无序,元素不可重复
# print(x_list[1])
# print(x_tupe[0])
# print(x_dict['a'])
# print(3 in x_set)
#########################################################################################################
# 第二节python运算符与表达式
# :=赋值
# v1 if cond else v2
# x1 or x2 x1为真值返回x1 否则返回x2
# x1 and x2 x1为假返回x1否则返回x2
# not
# in x in y y包含x返回真
# is 测试两个对象是否为同一个，即内存地址相同
# @ 矩阵乘
# *算术乘法，序列重复 /整除 //真除 %求余数，字符串格式变化
# ~按位求反 **幂运算
# +算数加法，列表元组字符串合并与连接
# -算术减法，集合列差

# # 2.2.1算术运算符
# import math
# a = [1, 2, 3]
# b = [5, 6, 7]
# print(a+b)
# print('abs'+'gsj')
# # C='S'+1#不同类型不能相加
# print(True+1)  # true为1，false为0
# print(False+1)
# print(a*3)  # 重复3遍
# print('abc'*3)
# x = [[1], [2], [3]]
# y = x*2
# print(y)
# print(x[0] is y[0] is y[3])  # 是同一个元素

# print(3/2)
# print(15//4)  # 求整商
# print(15.0//4)
# print(-15//4)

# x = 3**2
# y = pow(3, 2)
# print(math.isclose(x, y))
# x = pow(3, 2, 8)
# y = 3**2 % 8
# print(math.isclose(x, y))
# print(math.isclose(3**3*3, 3**(3**3)))

# # 2..2.2关系运算符
# print(1 < 6 < math.sqrt(9))
# print({1, 2, 3} == {3, 2, 1})
# print({1, 2, 4} > {1, 2, 3})  # 集合包含测试

# # 2.2.3成员测试运算符in 同一性测试运算符is
# print(3 in range(1, 10, 1))
# print('abc' in 'abcdsf')
# for i in (3, 5, 7):
#     print(i, end='\t')
# print(3 is 3)
# x=[300,300,300]
# print(x[0]is x[2])#基于值的内存管理，同一个值在内存中只有一份
# x=[1,2,3]
# y=[1,2,3]
# print(x is y)#现在的xy不是同一个内存下

# y=x#现在y指向的也是x的地址，修改x也会修改y
# x.append(4)#在列表末尾添加4
# print(x)
# print(y)
# print(x is y)

# #2.2.4位运算符
# #<< & | ^
# #还可以对集合操作

# #2.2.5逻辑运算符
# print(3>4 or 3)
# print(3>5 and 3)
# print(3 not in [1,2,3])

# #2.2.6矩阵乘法运算
# import numpy
# x=numpy.ones(3)
# print(x)

# #2.2.7补充说明
# # 不支持—-- ++运算，仍然表示加减正负
# #++i=+(+i)
# #--i=-(-i)
# #------i=-i 奇数个-等于1个-

#########################################################################################################
# # 2.3第三节关键字说明
# # False True None
# # and 逻辑与预算府
# # as 在import\ with\except语句中给对象起别名
# #assert 断言，用来确认某个条件必须满足
# # break 用在循环中，提前结束本次循环
# # class 用来定义类
# # continue 用在循环中，提前结束本次循环
# # def 用来定义函数
# # del 用来删除对象或对象成员
# # elif 用来选择结构中，表示 else if
# # else 可以用在选择结构，循环结构和异常值处理结构中
# # except 用在异常处理结构中，用来捕获特定类的异常
# # finally 用在异常处理中，用来表示不论是否发生异常都会执行的代码
# # for
# # from
# # global 声明全局变量
# # if
# # import
# # in
# # is
# # lambda用来定义lambda表达式类似于函数
# # nonlacal用来声明nonlacal变量
# # not
# # or逻辑或
# # pass空语句，什么都不做，占位符
# # raise用来显式抛出异常
# # return 在函数中用来指定返回值
# # try 在异常处理结构中用来限定可能会引发异常的代码块
# # while 循环
# # with 上下文管理器，具有自动管理资源的功能
# # yeild 在生成器函数中用来生成值
# import keyword
# print(keyword.kwlist)#查看所有关键字

#########################################################################################################
# # 2.4 第四节python 常用内置函数
# # dir(__builtins__)
# # print(dir(__builtins__))#查看所有内置函数
# # help('math')#可以用help查看模块的用法
# # help('abs')#!!可以用help查看函数的用法

# # 2.4.1类型转换与类型判断
# print(bin(555))#整数转二进制
# print(oct(555))#整数转八进制
# print(hex(555))#整数转十六进制

# print(int(-3.2))  # 返回实数的整数部分
# # 把十六进制转换为十进制
# print('0x22b', 16)
# print('22b', 16)
# # 二进制转十进制
# print(int(bin(54322), 2))
# # 字符串转十进制
# print('0b111', 0)  # 这里的0表示字符串隐含的进制
# print('111', 6)  # 字符串没有隐藏进制

# print(float(3))
# print(float(3.5))
# print(float('inf'))  # 无穷大
# float('nan')
# nan=float('nan')
# print(nan == float('nan'))  # nan无法比较大小
# #指定实部虚部
# print(complex(3,5))#3+5j
# print(complex(3))

# print(ord('a'))
# print(chr(65))
# print(chr(ord('A')+1))
# print(ord('夏'))
# print(ord('天'))
# print(ord('沉'))
# print(ord('落'))
# print(''.join(map(chr,(22799,22825,27785,33853))))#连接字符
# print(str(1234))
# print(str([1,2,3]))
# print({1,2,3})

# print(ascii('a'))
# print(ascii('夏天沉落在猫眼的钟面'))
# a=ascii('夏天沉落在猫眼的钟面')
# print(eval(a))#对字符串求值

# print(bytes())#生成字节串（空）
# print(bytes(3))#生成长度为3的字节串
# print('夏天沉落在猫眼的钟面','uft-8')
# x='夏天'.encode()
# print(list(x))#把字节串转为整数列表
# print(x.decode())#解码
# print(bytes(x))#列表转字节串

# x=list(range(5))#列表
# print(x)
# print(tuple(x))#元组
# print(x)
# print(dict(zip('1234','abcd')))#字典
# y=set('111234234535')#创建集合，自动去除重复
# print(y)
# y.add('0')#集合内添加元素0
# print(y)

# print(type(3))
# print(type([3,3]))
# print(type({3})in (list,tuple,dict))
# print(isinstance(3,(int,float,complex)))#判断是否在这几个类型中

# # 2.4.2 最值和求和
# from random import randint
# a = [randint(1, 100)for i in range(10)]  # 1~100间的10个随机数
# print(max(a), min(a), sum(a))
# print(max(['2', '111']))
# print(max(['2', '11'], key=len))

# lst = [[randint(1, 50)for i in range(5) for j in range(30)]]#列表推导式，生成包含30个子列表的列表；每个子列表中包含5个介于1~50的在整数
# print(max(lst,key=sum))#所有子列表中总合最大的
# print(max(lst,key=lambda x :x[1]))#所有子列表中第二个数最大的
# print(sum(range(1,11)))#默认加0
# print(sum(range(1,11),5))
# print(sum([[1,2],[3],[4]],[]))#这个操作占用空间很大，慎用

# #2.4.3 基本输入输出
# x=input('please input:')
# print(type(x))
# # print(int(x))#int 不能用于字符串字节串等等
# print(eval(x))#!!!!!这里输入hello world必须要加引号，不然这句话要报错，但是上面那句不会

# # print(value1,value2,value3,...,sep='',end='\n',file=sys.stdout,flush=false)
# # sep之前为内容，sep为分隔符，默认空格；file指定输出位置，默认标准控制台
# with open('test_fp.text', 'a+')as fp:
#     print(1, 2, 3, 4, 5, 'hello world', sep='\t', file=fp)

# #2.4.4排序与逆序
# import  random
# x=list(range(11))
# random.shuffle(x)
# print(x)
# print(sorted(x))
# print(sorted(x,key=lambda item:len(str(item)),reverse=True))#按转字符串长度降序
# print(sorted(x,key=str))#按转字符串长升序
# print(list(reversed(x)))

# #可以给集合排序
# #用reversed()给可迭代对象排序
# from operator import itemgetter
# #这些感觉用不上，好多好多，跳过吧

# # 2.4.5枚举
# print(list(enumerate('abcd')))#枚举字符串中的元素
# print(list(enumerate(['Python','Create'])))#枚举列表中的元素
# for index, value in enumerate(range(10,15)):#枚举 range对象中的元素
#     print((index,value),end=' ')
#     #enumerate 还支持一个start 参数
# print('\n')
# for item in enumerate(range(5),6):#计数从6开始
#     print(item,end=',')

# 2.4.6 map(),reduce(),filter()这个太复杂了
# map:一些迭代运算，通常配合lambda使用，具体见 【p48】
# reduce filter 类似

# # 2.4.7 range()
# # range(起始值（默认0），终止值，步长（默认1)）
# print(list(range(1, 11, 2)))  # 左闭右开区间
# # 常用于循环
# for i in range(4):
#     if  not i % 2 == 0:
#         print(i)

# # 2.4.8 zip()
# # 把多个可迭代对象对应位置元素组合到一起，返回一个可迭代的zip对象
# print(list(zip('123', 'abc', ',.!')))#组合不同类型迭代对象，转为list

# for item in zip('abcd', range(3)):#多余的一项忽略；zip对象可迭代
#     print(item)

# #2.4.9  eval()
# #计算字符串的值或者执行字符串中的python代码，也可以字符转换
# print(eval(b'3+5'))
# # print(eval(compile('print(3+5','test_fp.text','exec')))#！！！！！这个问题没解决